package imai78gae.heya.service;

import java.util.List;

import imai78gae.heya.model.Group;
import imai78gae.heya.model.UserInfo;

/**
 * ユーザアカウントに対する処理を提供するサービスクラスです。
 * 
 * @author imai78
 *
 */
public interface AccountService {

	/**
	 * 指定された{@code loginId}と{@code loginPw}がこのアプリケーションで利用できるかどうかを判断します。
	 * <p>
	 * 認証が許されたユーザのものであった場合、{@link UserInfo}オブジェクトを返します。
	 * <br />
	 * 認証が許されない、または存在しないユーザを指定された場合は、例外{@link ResourceNotFoundException}をスローします。
	 * </p>
	 * 
	 * @param loginId ログインID
	 * @param loginPw ログインパスワード
	 * @return 承認が許されたユーザの{@link UserInfo}
	 */
	UserInfo login(String loginId, String loginPw);

	/**
	 * このアプリケーションを使う事が出来るアカウントを新規に作成します。
	 * 
	 * @param userInfo 登録したいアカウントの{@link UserInfo}
	 */
	void createNewAccount(UserInfo userInfo);

	/**
	 * 指定されたアカウントの情報を更新します。
	 * 
	 * @param userInfo 更新したい{@link UserInfo}
	 */
	void modifyAccount(UserInfo userInfo);

	/**
	 * 指定されたアカウントを削除します。
	 * 
	 * @param userInfo 削除したい{@link UserInfo}
	 */
	void removeAccount(UserInfo userInfo);

	/**
	 * 指定されたログインIDを持つアカウントを返します。
	 * <p>
	 * 認証が許されない、または存在しないユーザを指定された場合は、例外{@link ResourceNotFoundException}をスローします。
	 * </p>
	 * 
	 * @param loginId ログインID
	 * @return 指定されたログインIDを持つアカウントの{@link UserInfo}
	 */
	UserInfo getUserInfo(String loginId);

	/**
	 * 指定されたログインIDのユーザが所属しているグループの一覧を返します。
	 * 
	 * @param loginId ログインID
	 * @return ユーザが所属する{@link Group}の一覧
	 */
	List<Group> getJoinedGroup(String loginId);

}
